#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/sem.h>
#define BUFSIZE 128
#define MAX_SEM 5
struct msg_buf
{
    long type;
    char msg[BUFSIZE];
};

int main()
{
    // key_t key;
    // int i;
    // struct stat buf;
    // i = atoi("4");
    // if((stat("/dev/shm/",&buf))==-1){
    //     perror("error");
    //     exit(EXIT_FAILURE);
    // }
    // printf("file st_dev=%x\n",buf.st_dev);
    // printf("file st_ino=%x\n",buf.st_ino);
    // key = ftok("/dev/shm/",i);
    // // key值的第31~24为ftok()第二个参数的低8位
    // // key值的第23~16为文件的buf.st_dev属性的低8位
    // // key值的第15~0为文件的buf.st_ino属性的低16位
    // printf("key=0x%x\t key>>24=%x\t key&0xffff=%x \t (key>>16)&0xff=%x\n",key,key>>24,key&0xffff,(key>>16)&0xff);
    // printf("helloworld\n");

    // key_t key;
    // int msgid;
    // struct msg_buf msg_send, msg_rcv;
    // struct msginfo buf;
    // char *ptr = "helloworld";
    // memset(&msg_send, '\0', sizeof(struct msg_buf));
    // memset(&msg_rcv, '\0', sizeof(struct msg_buf));
    // msg_send.type = 1;
    // msg_rcv.type = 1;
    // memcpy(msg_send.msg, ptr, strlen(ptr));
    // if ((key = ftok(".",'A')) == -1)
    // {
    //     perror("ERROR");
    //     exit(EXIT_FAILURE);
    // }

    // if ((msgid = msgget(key, 0600 | IPC_CREAT)) == -1)
    // {
    //     perror("msgget");
    //         exit(EXIT_FAILURE);
    // }
    // printf("msgsend_return=%d\n", msgsnd(msgid, (void *)&msg_send, strlen(msg_send.msg), 0));

    // msgctl(msgid,MSG_INFO,&buf);
    // printf("buf.msgmax=%d\n",buf.msgmax);

    // printf("msgrev_return=%d\n", msgrcv(msgid, (void *)&msg_rcv, BUFSIZE,msg_rcv.type, 0));

    // printf("rcv msg:%s\n",msg_rcv.msg);
    // printf("msgctl_return=%d\n",msgctl(msgid,IPC_RMID,0));

    // int sem;
    // key_t key;
    // if ((key = ftok(".", 'B')) == -1)
    // {
    //     perror("ftok");
    //     exit(EXIT_FAILURE);
    // }

    // if ((sem = semget(key, 3, IPC_CREAT | 0700)) == -1)
    // {
    //     perror("semget");
    //     exit(EXIT_FAILURE);
    // }
    // printf("sem1 id is:%d\n", sem);
    // semctl(sem, 0, IPC_RMID, (struct msquid_ds *)0); // 删除信号量集合

    int i, ret, semid;
    unsigned short sem_array[MAX_SEM];
    unsigned short sem_read_array[MAX_SEM];
    union semun
    {
        int val;
        struct semid_ds *buf;
        unsigned short *array;
    } arg;
    semid = semget(IPC_PRIVATE, MAX_SEM, IPC_CREAT | 0666); // 创建信号量集合

    if (semid != -1)
    {
        for (int i = 0; i < MAX_SEM; i++)
        {
            sem_array[i] = (unsigned short)(i + 1);
        }
        arg.array = sem_array;
        ret = semctl(semid, 0, SETALL, arg);
        if (ret == -1)
        {
            printf("error:");
        }
        arg.array = sem_read_array;
        ret = semctl(semid, 0, GETALL, arg);
        if (ret == -1)
        {
            printf("error:");
        }
        for (int i = 0; i < MAX_SEM; i++)
        {
            printf("semaphore %d ,value %d,\n", i, sem_read_array[i]);
        }
        for (int i = 0; i < MAX_SEM; i++)
        {
            ret = semctl(semid, i, GETVAL);
            printf("semaphore %d ,value %d,\n", i, ret);
        }
        ret = semctl(semid, 0, IPC_RMID);
    }

    return 0;
}
